﻿/*
 * Created by SharpDevelop.
 * User: Usuario
 * Date: 23/10/2011
 * Time: 09:06 p.m.
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using Business_Entity;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;


namespace DAOFactory
{
	/// <summary>
	/// Description of DAOPedidoAbastecimiento.
	/// </summary>
	public class DAOPedidoAbastecimiento
	{
		public DAOPedidoAbastecimiento()
		{
		}
		
		public List<BEPedidoAbastecimiento> searchPedidos(int cod, String estado, String fIni, String fFin, int estAt, int codigoTienda){
			//estAt: -1(todos), 0 (no atendidos), 1(paso por despacho), 2(paso por compras), 3(busca 1 y 2)
			//codtienda es el código de la tienda que está haciendo el pedido de abastecimiento
			//Si codTienda es 0, busca todos los pedidos
			String cmdSQL;
			SqlCommand command;
			SqlDataReader res;
			BEPedidoAbastecimiento pedido;
			BETienda tienda;
			BEEstadoPedidoAbasteciemiento est;
			int codPed, codTienda, codEstado;
			String nomTienda, descEstado;
			DateTime fec;
			List<BEPedidoAbastecimiento> lista;
			if(codigoTienda!=0){
				cmdSQL = "SELECT P.*, T.NOMBRE, E.DESCRIPCION FROM PEDIDOABASTECIMIENTO P, TIENDA T, ESTADOPEDIDOABASTECIMIENTO E" +
					" WHERE P.IDTIENDA=T.IDTIENDA AND P.IDTIENDA=" + codigoTienda + " AND P.IDESTADOPEDIDO=E.IDESTADOPEDIDO"/*" AND P.IDESTADOPEDIDO=3"*/;
			}
			else{
				cmdSQL = "SELECT P.*, T.NOMBRE, E.DESCRIPCION FROM PEDIDOABASTECIMIENTO P, TIENDA T, ESTADOPEDIDOABASTECIMIENTO E" +
					" WHERE P.IDTIENDA=T.IDTIENDA AND P.IDESTADOPEDIDO=E.IDESTADOPEDIDO"/*" AND P.IDESTADOPEDIDO=3"*/;
			}
			if(cod!=0){
				cmdSQL = cmdSQL + " AND P.IDPEDIDOABASTECIMIENTO=" + cod;
			}
			if(estado!=""){
				cmdSQL = cmdSQL + " AND E.DESCRIPCION='" + estado + "'";
			}
			if(estAt==-1){
			}
			else{
				if(estAt==3){
					cmdSQL = cmdSQL + " AND (P.ATENDIDO=1 OR P.ATENDIDO=2)";
				}
				else{
					cmdSQL = cmdSQL + " AND P.ATENDIDO=" + estAt;
				}
			}
			if(fIni!=""){
				if(fFin!=""){
					cmdSQL = cmdSQL + " AND DATEADD(DAY, DATEDIFF(DAY, 0, P.FECHA), 0) BETWEEN '" + fIni + "' AND '" + fIni + "'";
				}
				else{
					cmdSQL = cmdSQL + " AND DATEADD(DAY, DATEDIFF(DAY, 0, P.FECHA), 0) >= '" + fIni + "'";
				}
			}
			else{
				if(fFin!=""){
					cmdSQL = cmdSQL + " AND DATEADD(DAY, DATEDIFF(DAY, 0, P.FECHA), 0) <= '" + fFin + "'";
				}
			}
			cmdSQL = cmdSQL + ";";
			lista = new List<BEPedidoAbastecimiento>();
			command =  new SqlCommand(cmdSQL, ConnectionManager.getConnection());
			try{
				res = command.ExecuteReader();
				while(res.Read()){
					codPed = Int32.Parse(res[0].ToString());
					codTienda = Int32.Parse(res[2].ToString());
					fec = DateTime.Parse(res[1].ToString());
					codEstado = Int32.Parse(res[3].ToString());
					nomTienda = res[5].ToString();
					descEstado = res[6].ToString();
					tienda = new BETienda();
					tienda.Id = codTienda;
					tienda.Nombre = nomTienda;
					est = new BEEstadoPedidoAbasteciemiento(codEstado, descEstado);
					pedido = new BEPedidoAbastecimiento(codPed, fec, tienda);
					pedido.Estado = est;
					lista.Add(pedido);
				}
			}
			catch{
				return null;			
			}
			res.Close();
			return lista;
		}
		public List<BELineaPedidoAbastecimiento> getDetalleByCodigo(int cod){
			String cmdSQL, descEst;
			SqlCommand command;
			SqlDataReader res;
			BELineaPedidoAbastecimiento det=null;
			BETipoProducto tipo;
			BEUnidadProducto unidad;
			BEEstadoPedidoAbasteciemiento beEstado;
			DAOProducto dProd;
			DAOProveedor dProv;
			List<BEProducto> prod;	
			BEProveedor prov=null;			
			List<BELineaPedidoAbastecimiento> lista;
			int codProd, cant, codProv, cantRec, codLin, codPed, codEst, cantEnv;
			String nombre; String descripcion; String tipoc;
			
			
			//obtiene todos los detalles del pedido seleccionado
			cmdSQL = "SELECT P.*,E.DESCRIPCION,F.Nombre,F.Descripcion,G.Descripcion FROM PEDIDOABASTECIMIENTOLINEA P, ESTADOPEDIDOABASTECIMIENTO E, PRODUCTO F,TIPOPRODUCTO G WHERE P.IDPEDIDOABASTECIMIENTO=" + cod + " AND P.IDESTADOPEDIDO=E.IDESTADOPEDIDO AND f.idProducto=p.idProducto and f.idTipoProducto=g.idTipoProducto;";
			dProd = new DAOProducto();
			dProv = new DAOProveedor();
			lista = new List<BELineaPedidoAbastecimiento>();
			command =  new SqlCommand(cmdSQL, ConnectionManager.getConnection());
			try{
				res = command.ExecuteReader();
				while(res.Read()){
					codLin = Int32.Parse(res[0].ToString());
					codPed = Int32.Parse(res[1].ToString());
					codProd = Int32.Parse(res[2].ToString());
					codProv = Int32.Parse(res[3].ToString());
					cant = Int32.Parse(res[4].ToString());
					cantRec = Int32.Parse(res[5].ToString());
					codEst = Int32.Parse(res[6].ToString());
					cantEnv = Int32.Parse(res[7].ToString());
					descEst = res[8].ToString();
					nombre= res[9].ToString();
					descripcion=res[10].ToString();
					tipoc=res[11].ToString();
					beEstado = new BEEstadoPedidoAbasteciemiento(codEst, descEst);
					tipo = new BETipoProducto();
					unidad = new BEUnidadProducto();
					//se crea cualquier producto, luego se creara el producto verdadero
					BEProducto p = new BEProducto(codProd,"","",unidad,tipo);
					//lo mismo con el proveedor, se crea un proveedor cualquiera y luego se crea el proveedor verdadero
					BEProveedor pr = new BEProveedor(codProv, "","","","","","",'y');
					det = new BELineaPedidoAbastecimiento(p, cant);
					det.CodLinea = codLin;
					det.CodPedido = codPed;
					det.Proveedor = pr;
					det.CantidadRecibida = cantRec;
					det.CantidadEnviada = cantEnv;
					det.Estado = beEstado;
					det.Producto.Nombre=nombre;
					det.Producto.TipoProducto.Descripcion=tipoc;
					det.Producto.Descripcion=descripcion;
					lista.Add(det);
					
				}
			}
			catch{
				return lista;
			}
			res.Close();
			return lista;
		}
		public List<BELineaPedidoAbastecimiento> getDetalleByCod(int cod){
			String cmdSQL, descEst;
			SqlCommand command;
			SqlDataReader res = null;
			BELineaPedidoAbastecimiento det=null;
			BETipoProducto tipo;
			BEUnidadProducto unidad;
			BEEstadoPedidoAbasteciemiento beEstado;
			DAOProducto dProd;
			DAOProveedor dProv;
			List<BEProducto> prod;	
			BEProveedor prov=null;			
			List<BELineaPedidoAbastecimiento> lista;
			int codProd, cant, codProv, cantRec, codLin, codPed, codEst, cantEnv;
			
			
			//obtiene todos los detalles del pedido seleccionado
			cmdSQL = "SELECT P.*, E.DESCRIPCION FROM PEDIDOABASTECIMIENTOLINEA P, ESTADOPEDIDOABASTECIMIENTO E WHERE P.IDPEDIDOABASTECIMIENTO=" + cod + " AND P.IDESTADOPEDIDO=E.IDESTADOPEDIDO;";
			dProd = new DAOProducto();
			dProv = new DAOProveedor();
			lista = new List<BELineaPedidoAbastecimiento>();
			command =  new SqlCommand(cmdSQL, ConnectionManager.getConnection());
			try{
				res = command.ExecuteReader();
				while(res.Read()){
					codLin = Int32.Parse(res[0].ToString());
					codPed = Int32.Parse(res[1].ToString());
					codProd = Int32.Parse(res[2].ToString());
					codProv = Int32.Parse(res[3].ToString());
					cant = Int32.Parse(res[4].ToString());
					cantRec = Int32.Parse(res[5].ToString());
					codEst = Int32.Parse(res[6].ToString());
					cantEnv = Int32.Parse(res[7].ToString());
					descEst = res[8].ToString();
					beEstado = new BEEstadoPedidoAbasteciemiento(codEst, descEst);
					tipo = new BETipoProducto();
					unidad = new BEUnidadProducto();
					//se crea cualquier producto, luego se creara el producto verdadero
					BEProducto p = new BEProducto(codProd,"","",unidad,tipo);
					//lo mismo con el proveedor, se crea un proveedor cualquiera y luego se crea el proveedor verdadero
					BEProveedor pr = new BEProveedor(codProv, "","","","","","",'y');
					det = new BELineaPedidoAbastecimiento(p, cant);					det.CodLinea = codLin;					det.CodPedido = codPed;					det.Proveedor = pr;
					det.CantidadRecibida = cantRec;
					det.CantidadEnviada = cantEnv;
					det.Estado = beEstado;
					lista.Add(det);
					
				}
				res.Close();
			}
			catch{
				if(res != null)
					res.Close();
				return lista;
			}
			return lista;
		}
		
		public BEPedidoAbastecimiento getPedidoByCod(int cod){
			String cmdSQL, nomTienda, descEstado;
			int codPed, codTienda, codEstado;
			DateTime fec;
			BETienda tienda;
			SqlCommand command;
			SqlDataReader res = null;
			BEEstadoPedidoAbasteciemiento est;
						
			//CORREGIR, LUEGO VA A SER INT NO CHAR!!!!!!!!
			cmdSQL = "SELECT P.*, T.NOMBRE, E.DESCRIPCION FROM PEDIDOABASTECIMIENTO P, TIENDA T, ESTADOPEDIDOABASTECIMIENTO E" +
				" WHERE P.IDTIENDA=T.IDTIENDA AND P.IDESTADOPEDIDO=E.IDESTADOPEDIDO AND P.IDPEDIDOABASTECIMIENTO=" + cod + ";";
			
			command =  new SqlCommand(cmdSQL, ConnectionManager.getConnection());
			BEPedidoAbastecimiento pedido = null;
			try{
				res = command.ExecuteReader();	
				while(res.Read()){
					codPed = Int32.Parse(res[0].ToString());
					codTienda = Int32.Parse(res[2].ToString());
					fec = DateTime.Parse(res[1].ToString());
					codEstado = Int32.Parse(res[3].ToString());
					nomTienda = res[5].ToString();
					descEstado = res[6].ToString();
					tienda = new BETienda();
					tienda.Id = codTienda;
					tienda.Nombre = nomTienda;
					est = new BEEstadoPedidoAbasteciemiento(codEstado, descEstado);
					pedido = new BEPedidoAbastecimiento(codPed, fec, tienda);
					pedido.Estado = est;
				}
				res.Close();
				return pedido;
			}
			catch{
				res.Close();
				return pedido;			
			}
		}
		
		public int eliminaPedido(int cod){
			
            SqlConnection conn = ConnectionManager.getConnection();
			//se debe eliminar primero las lineas de pedido abastecimiento asociados con ese pedido
			DAOLineaPedidoAbastecimiento linea = new DAOLineaPedidoAbastecimiento();
			int res = linea.eliminaPedido(cod);
			String cmdSQL;
			if(res==1){
				//elimina el pedido en sí
				cmdSQL = "DELETE FROM PEDIDOABASTECIMIENTO WHERE IDPEDIDOABASTECIMIENTO=" + cod + ";";
				 SqlCommand command = new SqlCommand(cmdSQL, conn);
					
				try{
	               	command.ExecuteNonQuery();
	               	return 1;
				}
				catch{
					return 0;
				}
			}
			else{//hubo algún error y no se puede continuar
				return 0;
			}
		}
		
		public List<BEPedidoAbastecimiento> getAll(){
			String cmdSQL, nomTienda, descEstado;
			int codPedido, codTienda, codEstado;
			DateTime fecha;
			List<BEPedidoAbastecimiento> lista;
			SqlDataReader res;		
			BETienda tienda;
			BEEstadoPedidoAbasteciemiento estado;
			BEPedidoAbastecimiento pedido;	
			
			
			lista = new List<BEPedidoAbastecimiento>();
			cmdSQL = "SELECT P.*, T.NOMBRE, E.DESCRIPCION FROM PEDIDOABASTECIMIENTO P, TIENDA T, ESTADOPEDIDOABASTECIMIENTO E " +
				"WHERE P.IDTIENDA=T.IDTIENDA AND P.IDESTADOPEDIDO=E.IDESTADOPEDIDO ORDER BY IDPEDIDOABASTECIMIENTO;";
			SqlCommand command;
			command =  new SqlCommand(cmdSQL, ConnectionManager.getConnection());
			try{
				res = command.ExecuteReader();
			}
			catch{
				//Si devuelde null es poruqe hubo un error al cargar la lista de pedidos
				return null;
			}
			while(res.Read()){
				codPedido = Int32.Parse(res[0].ToString());
				codTienda = Int32.Parse(res[2].ToString());
				fecha = DateTime.Parse(res[1].ToString());
				codEstado = Int32.Parse(res[3].ToString());
				nomTienda = res[5].ToString();
				descEstado = res[6].ToString();
				tienda = new BETienda();
				tienda.Nombre = nomTienda;
				tienda.Id = codTienda;
				estado = new BEEstadoPedidoAbasteciemiento(codEstado, descEstado);				
				pedido = new BEPedidoAbastecimiento(codPedido, fecha, tienda);
				pedido.Estado = estado;
				lista.Add(pedido);
			}
			res.Close();
			return lista;
		}
		
		public int actualizaEstado(int codPed, int estado){
			
            SqlConnection conn = ConnectionManager.getConnection();
			
            String cmdSQL = "UPDATE PEDIDOABASTECIMIENTO SET IDESTADOPEDIDO=" + estado + ", ATENDIDO=1 WHERE IDPEDIDOABASTECIMIENTO=" + codPed + ";";
            SqlCommand command = new SqlCommand(cmdSQL, conn);
	        try
            {
	            command.ExecuteNonQuery();
                return 1;//se elimino correctamente
            }
            catch {
                return 0;//no se puedo eliminar por algun error
            }
		}
		
		public int registraPedido(int codTienda){
			String cmdSQL;
			SqlDataReader res = null;
			int cod=0;
			
            SqlConnection conn = ConnectionManager.getConnection();
			cmdSQL = "INSERT INTO PEDIDOABASTECIMIENTO (IDTIENDA, FECHA, IDESTADOPEDIDO, ATENDIDO) VALUES" +
				"( " + codTienda + ", getdate(), 3, 0);";
			SqlCommand command = new SqlCommand(cmdSQL, conn);
			try{
	            command.ExecuteNonQuery();
				cmdSQL = "SELECT MAX(IDPEDIDOABASTECIMIENTO) FROM PEDIDOABASTECIMIENTO;";
				
				command =  new SqlCommand(cmdSQL, ConnectionManager.getConnection());
				res = command.ExecuteReader();
				while(res.Read()){
					cod = Int32.Parse(res[0].ToString());
				}
				res.Close();
				return cod;
			}
			catch{
				res.Close();
				//Si devuelde null es poruqe hubo un error al cargar la lista de pedidos
				return 0;
			}
		}
				
	}
}
